package com.yangfan.juc.atomic;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @description: 尝试去获取 锁 如果 获取不到 则会抛出异常 ， 在外面捕获这个异常。
 *          等一会 在来 获取。
 * @author: yangfan
 * @date: Created in 2020/3/20 0020 15:11
 * @modified By:
 */
public class CompareAndSetLock {


    private final AtomicInteger value = new AtomicInteger(0);

    private Thread currentThread; //记录当前线程


    /**
     * 尝试去获取 锁
     * 预期他是 0 没有人获取到锁
     * 如果预期能够拿到则 给他成锁上
     * @throws GetLockException
     */
    public void tryLock() throws GetLockException {
        final boolean success = value.compareAndSet(0, 1);
        if(!success){
            throw new GetLockException("获取锁失败！");
        }else{
            //如果拿到了锁，则记录拿到锁的线程。
            this.currentThread = Thread.currentThread();
        }

    }


    /**
     * 释放锁
     */
    public void unLock(){

        if( 0 == value.get() ){
            return;
        }

        //如果锁没有释放
        if(this.currentThread == Thread.currentThread()){
            value.compareAndSet(1, 0);
        }

    }





}
